package com.zy.kotlinbaselibrary.base.utils

import java.lang.reflect.ParameterizedType

object TUtils{

    /**
     * 获得超类的泛型参数的实际类型。。
     *
     * @param o
     * @param i
     * @param <T>
     * @return
     */

    fun<T> getT(o: Any, i: Int): T?{
        try {
            /**
             * getClass().getGenericSuperclass()返回表示此 Class 所表示的实体（
             * 类、接口、基本类型或 void）的直接超类的 Type
             * 然后将其转换ParameterizedType。。
             */
            val p = o.javaClass
                .genericSuperclass as ParameterizedType
            /**
             * getActualTypeArguments()返回表示此类型实际类型参数的 Type 对象的数组。
             * [0]就是这个数组中第一个了。。
             */
            val mClass = p.actualTypeArguments[i] as Class<T>
            return mClass.newInstance()
        } catch (e: InstantiationException) {
        } catch (e: IllegalAccessException) {
        } catch (e: ClassCastException) {
        }

        return null
    }

    // 获得类名className对应的Class对象
    fun forName(className: String): Class<*>? {
        try {
            return Class.forName(className)
        } catch (e: ClassNotFoundException) {
            e.printStackTrace()
        }

        return null
    }
}